﻿using System;
using System.Collections.Generic;
using Vallejos.Entidades.Enums;
using Vallejos.Entidades.ModeloDeDatos;

namespace Vallejos.Negocio
{
    internal class HelperCache
    {

        #region Listas
        private List<Permiso> _permisos;
        private List<Ambito> _ambitos;
        private List<Sexo> _sexos;
        private List<Provincia> _provincias;
        private List<Localidad> _localidades;
        private List<Marca> _marcas;
        private List<Modelo> _modelos;
        private List<TipoCombustible> _tiposCombustible;
        private List<TipoFinanciacion> _tiposFinanciacion;
        private List<UsoDeProducto> _usosDeProducto;
        private List<TipoProducto> _tiposProducto;
        private List<EstadoDeAnalisis> _estadosDeAnalisis;
        private List<EstadoDePrestamo> _estadosDePrestamo;
        private List<Rubro> _rubros;
        private List<MotivoRezhazo> _motivosRezhazo;
        public List<EmpresaDeServicio> _empresaDeServicio { get; set; }
        public List<T> ObtenerLista<T>()
        {
            List<T> lista = null;
            if (typeof(T) == typeof(EmpresaDeServicio))
                lista = (List<T>)Convert.ChangeType(_empresaDeServicio, typeof(List<T>));
            if (typeof (T) == typeof (Ambito))
                lista = (List<T>)Convert.ChangeType(_ambitos, typeof(List<T>));
            else if (typeof (T) == typeof (Permiso))
                lista = (List<T>) Convert.ChangeType(_permisos, typeof (List<T>));
            else if (typeof(T) == typeof(Sexo))
                lista = (List<T>)Convert.ChangeType(_sexos, typeof(List<T>));
            else if (typeof(T) == typeof(Provincia))
                lista = (List<T>)Convert.ChangeType(_provincias, typeof(List<T>));
            else if (typeof(T) == typeof(Localidad))
                lista = (List<T>)Convert.ChangeType(_localidades, typeof(List<T>));
            else if (typeof(T) == typeof(Modelo))
                lista = (List<T>)Convert.ChangeType(_modelos, typeof(List<T>));
            else if (typeof(T) == typeof(Marca))
                lista = (List<T>)Convert.ChangeType(_marcas, typeof(List<T>));
            else if (typeof(T) == typeof(TipoCombustible))
                lista = (List<T>)Convert.ChangeType(_tiposCombustible, typeof(List<T>));
            else if (typeof(T) == typeof(TipoFinanciacion))
                lista = (List<T>)Convert.ChangeType(_tiposFinanciacion, typeof(List<T>));
            else if (typeof(T) == typeof(UsoDeProducto))
                lista = (List<T>)Convert.ChangeType(_usosDeProducto, typeof(List<T>));
            else if (typeof(T) == typeof(TipoProducto))
                lista = (List<T>)Convert.ChangeType(_tiposProducto, typeof(List<T>));
            else if (typeof(T) == typeof(EstadoDeAnalisis))
                lista = (List<T>)Convert.ChangeType(_estadosDeAnalisis, typeof(List<T>));
            else if (typeof(T) == typeof(EstadoDePrestamo))
                lista = (List<T>)Convert.ChangeType(_estadosDePrestamo, typeof(List<T>));
            else if (typeof(T) == typeof(Rubro))
                lista = (List<T>)Convert.ChangeType(_rubros, typeof(List<T>));
            else if (typeof(T) == typeof(MotivoRezhazo))
                lista = (List<T>)Convert.ChangeType(_motivosRezhazo, typeof(List<T>));

            return lista;
        }

        public List<T> SetearLista<T>(List<T> lista)
        {
            if (typeof(T) == typeof(EmpresaDeServicio))
                _empresaDeServicio = (List<EmpresaDeServicio>)Convert.ChangeType(lista, typeof(List<T>));
            if (typeof(T) == typeof(Ambito))
                _ambitos = (List<Ambito>)Convert.ChangeType(lista, typeof(List<T>));
            else if (typeof(T) == typeof(Permiso))
                _permisos = (List<Permiso>)Convert.ChangeType(lista, typeof(List<T>));
            else if (typeof(T) == typeof(Sexo))
                _sexos = (List<Sexo>)Convert.ChangeType(lista, typeof(List<T>));
            else if (typeof(T) == typeof(Provincia))
                _provincias = (List<Provincia>)Convert.ChangeType(lista, typeof(List<T>));
            else if (typeof(T) == typeof(Localidad))
                _localidades = (List<Localidad>)Convert.ChangeType(lista, typeof(List<T>));
            else if (typeof(T) == typeof(Modelo))
                _modelos = (List<Modelo>)Convert.ChangeType(lista, typeof(List<T>));
            else if (typeof(T) == typeof(Marca))
                _marcas = (List<Marca>)Convert.ChangeType(lista, typeof(List<T>));
            else if (typeof(T) == typeof(TipoCombustible))
                _tiposCombustible = (List<TipoCombustible>)Convert.ChangeType(lista, typeof(List<T>));
            else if (typeof(T) == typeof(TipoFinanciacion))
                _tiposFinanciacion = (List<TipoFinanciacion>)Convert.ChangeType(lista, typeof(List<T>));
            else if (typeof(T) == typeof(UsoDeProducto))
                _usosDeProducto = (List<UsoDeProducto>)Convert.ChangeType(lista, typeof(List<T>));
            else if (typeof(T) == typeof(TipoProducto))
                _tiposProducto = (List<TipoProducto>)Convert.ChangeType(lista, typeof(List<T>));
            else if (typeof(T) == typeof(EstadoDeAnalisis))
                _estadosDeAnalisis = (List<EstadoDeAnalisis>)Convert.ChangeType(lista, typeof(List<T>));
            else if (typeof(T) == typeof(EstadoDePrestamo))
                _estadosDePrestamo = (List<EstadoDePrestamo>)Convert.ChangeType(lista, typeof(List<T>));
            else if (typeof(T) == typeof(Rubro))
                _rubros = (List<Rubro>)Convert.ChangeType(lista, typeof(List<T>));
            else if (typeof(T) == typeof(MotivoRezhazo))
                _motivosRezhazo = (List<MotivoRezhazo>)Convert.ChangeType(lista, typeof(List<T>));

            return lista;
        }

        #endregion

        #region Entidades
        private Perfil _perfil;
        private Persona _persona;
        private Producto _producto;
        private Concesionaria _concesionaria;
        private SolicitudDeAnalisisCrediticio _solicitudDeAnalisisCrediticio;
        private SolicitudDePrestamo _solicitudDePrestamo;

        public void AlmacenarEntidadEnEdicion<T>(T entidad)
        {
            if (typeof(T) == typeof(Solicitud))
            {
                if (entidad.GetType() == typeof(SolicitudDeAnalisisCrediticio))
                    _solicitudDeAnalisisCrediticio = (SolicitudDeAnalisisCrediticio)Convert.ChangeType(entidad, typeof(SolicitudDeAnalisisCrediticio));
                else
                    _solicitudDePrestamo = (SolicitudDePrestamo)Convert.ChangeType(entidad, typeof(SolicitudDePrestamo));
            }
            if (typeof(T) == typeof(Perfil))
                _perfil = (Perfil)Convert.ChangeType(entidad, typeof(Perfil));
            if (typeof(T) == typeof(Persona))
            {
                try
                {
                    _persona = (Persona)Convert.ChangeType(entidad, typeof(EmpleadoBancario));
                }
                catch (Exception)
                {
                    try
                    {
                        _persona = (Persona)Convert.ChangeType(entidad, typeof(EmpleadoDeConcesionaria));
                    }
                    catch (Exception)
                    {
                        _persona = (Persona)Convert.ChangeType(entidad, typeof(Cliente));
                    }
                }
                
            }
            if (typeof(T) == typeof(Producto))
                _producto = (Producto)Convert.ChangeType(entidad, typeof(Producto));
            if (typeof(T) == typeof(Concesionaria))
                _concesionaria = (Concesionaria)Convert.ChangeType(entidad, typeof(Concesionaria));
        }
        
        public T RecuperarEntidadEnEdicion<T>()
        {
            var entidad = default(T);

            if (typeof(T) == typeof(SolicitudDeAnalisisCrediticio))
                entidad = (T)Convert.ChangeType(_solicitudDeAnalisisCrediticio, typeof(T));
            if (typeof(T) == typeof(SolicitudDePrestamo))
                entidad = (T)Convert.ChangeType(_solicitudDePrestamo, typeof(T));
            if (typeof(T) == typeof(Perfil))
                entidad = (T)Convert.ChangeType(_perfil, typeof(T));
            if (typeof(T) == typeof(Persona))
            {
                if (_persona == null)
                    entidad = (T)Convert.ChangeType(_persona, typeof(Cliente));
                else
                {
                    switch (_persona.Ambito.IdAmbito)
                    {
                        case IdAmbito.Clientes:
                            entidad = (T)Convert.ChangeType(_persona, typeof(Cliente));
                            break;
                        case IdAmbito.Concesionarias:
                            entidad = (T)Convert.ChangeType(_persona, typeof(EmpleadoDeConcesionaria));
                            break;
                        case IdAmbito.Banco:
                            entidad = (T)Convert.ChangeType(_persona, typeof(EmpleadoBancario));
                            break;
                    }
                }
            }
            if (typeof(T) == typeof(Producto))
                entidad = (T)Convert.ChangeType(_producto, typeof(T));
            if (typeof(T) == typeof(Concesionaria))
                entidad = (T)Convert.ChangeType(_concesionaria, typeof(T));

            return entidad;
        }
        #endregion
    }
}